home *** CD-ROM | disk | FTP | other *** search
/ Cracking 2 / Cracking II..iso / Tools / ApiHooks 3.0 / ApiHooksDLL.bat < prev    next >
DOS Batch File  |  2000-06-18  |  21KB  |  562 lines

  1. ;@goto translate
  2.  
  3.  
  4. .586P
  5.  
  6. .MODEL             FLAT, STDCALL
  7.  
  8.    OPTION          CASEMAP: NONE
  9.  
  10.  
  11.    INCLUDE         WINDOWS.inc
  12.    UNICODE         = FALSE
  13.    INCLUDE         APIMACRO.mac
  14.    INCLUDE         NtStatus.inc
  15.  
  16.    INCLUDE         AHinc.inc
  17.  
  18.    INCLUDE         ApiHooks.inc
  19.  
  20.    INCLUDE         NtStruc.inc
  21.  
  22.    INCLUDELIB      iKERNEL32.lib
  23.    INCLUDELIB      iUSER32.lib
  24.    INCLUDELIB      iADVAPI32.lib
  25. ;------------------------------------------------------------------------------
  26. .CODE
  27.  
  28.    ASSUME          FS: NOTHING
  29.  
  30.    INCLUDE         ApiWorks.inc
  31.    TEXTA           zSE_DEBUG_NAME,  <SeDebugPrivilege/0>
  32.    INCLUDE         ModWorks.inc
  33.  
  34.    ;place for APIs which were retrieved via GetProcAddress
  35.    ;initialzed with names of APIs for saving image size
  36.  
  37.    ALIGN 4
  38.    VirtualAllocEx  LABEL DWORD
  39.    K32             BYTE  'KERN'
  40.    sK32            EQU   OFFSET K32
  41.    VirtualFreeEx   LABEL DWORD
  42.                    BYTE  'EL32'
  43.    CreateToolhelp32Snapshot  LABEL DWORD
  44.                    BYTE  '.DLL'
  45.    NtQueryInformationProcess  LABEL DWORD
  46.                    BYTE  0
  47.    CT32S           BYTE  'Cre'
  48.    sCT32S          EQU   OFFSET CT32S
  49.    NtQuerySystemInformation   LABEL DWORD
  50.                    BYTE  'ateT'
  51.    RtlCreateUserThread   LABEL DWORD
  52.                    BYTE  'oolh'
  53.    NtQueryInformationThread  LABEL DWORD
  54.                    BYTE  'elp3'
  55.    Thread32First   LABEL DWORD
  56.                    BYTE  '2Sna'
  57.    Thread32Next    LABEL DWORD
  58.                    BYTE  'psho'
  59.    NtOpenThread    LABEL DWORD
  60.                    BYTE  't',0
  61.    T32F            BYTE  'Th'
  62.    sT32F           EQU   OFFSET T32F
  63.    W32Version      LABEL DWORD
  64.                    BYTE  'read'
  65.    CurrentProcess  LABEL DWORD
  66.                    BYTE  '32Fi'
  67.    CurPID          LABEL DWORD
  68.                    BYTE  'rst',0
  69.  
  70.    RemoteAlloc     DWORD RemoteAlloc9x
  71.    RemoteExec      DWORD RemoteExec9x
  72.    RemoteFree      DWORD RemoteFree9x
  73.    OpenAllThreads  DWORD OpenAllThreads9x
  74.  
  75. ;-----------------------------------------
  76.   ;For NT user thread termination is used NtTerminateThread not ExitThread,
  77.   ;because KERNEL32.dll may not be present in the target process, while
  78.   ;NTDLL.dll is present everywhere. For more comfort I could prepend
  79.   ;LdrShutdownThread.
  80.   NTThreadExit:
  81.    PUSHp     EAX,  CurrentThread, EAX    ; 4
  82.    BYTE      68H     ;PUSH DWORD         ;+1
  83.    NtTerminateThread  DWORD ?            ;+4
  84.    RET                                   ;+1
  85.   NTThreadExitSize  EQU ($-NTThreadExit) ; 10 ~ 12 = movsd,movsd,movsd
  86. ;-----------------------------------------
  87.    ;names of NT APIs for GetProcAddress
  88.  
  89.    TEXTA     VAEX, <VirtualAllocEx/0>
  90.    TEXTA     VFEX, <VirtualFreeEx/0>
  91.    TEXTA     NOPT, <NtOpenThread/0>
  92.    TEXTA     NQIP, <NtQueryInformationProcess/0>
  93.    TEXTA     NQSI, <NtQuerySystemInformation/0>
  94.    TEXTA     RCUT, <RtlCreateUserThread/0>
  95.    TEXTA     NTTH, <NtTerminateThread/0>
  96.    TEXTA     NQIT, <NtQueryInformationThread/0>
  97. ;=================================================================================
  98.   DllMain          PROC
  99.    CMP       DWORD PTR [ESP+8], DLL_PROCESS_ATTACH ;only this is important
  100.    JNE       DllMainRet
  101.    iWin32    DisableThreadLibraryCalls, [ESP+4] ;don't bother with DLL_THREAD_*
  102.    PUSHp     ESI, EDI             ;save used registers
  103. ;--------------
  104.    iWin32i   GetModuleHandle, sK32     ;initialize KERNEL32 APIs
  105.    iMOV      ESI, GetProcAddress
  106.    MOV       EDI, EAX
  107.    sWin32    ESI, EDI, sVAEX
  108.    MOV       VirtualAllocEx, EAX
  109.    sWin32    ESI, EDI, sVFEX
  110.    MOV       VirtualFreeEx,  EAX
  111.    sWin32    ESI, EDI, sCT32S
  112.    MOV       CreateToolhelp32Snapshot, EAX
  113.    sWin32    ESI, EDI, sT32F
  114.    MOV       Thread32First,  EAX
  115.    sWin32    ESI, EDI, sT32N
  116.    MOV       Thread32Next,   EAX
  117.  
  118.    iWin32i   GetModuleHandle, sNTDLL    ;initialize NTDLL APIs
  119.    MOV       EDI, EAX
  120.    sWin32    ESI, EDI, sNOPT
  121.    MOV       NtOpenThread, EAX
  122.    sWin32    ESI, EDI, sNQIP
  123.    MOV       NtQueryInformationProcess, EAX
  124.    sWin32    ESI, EDI, sNQSI
  125.    MOV       NtQuerySystemInformation, EAX
  126.    sWin32    ESI, EDI, sRCUT
  127.    MOV       RtlCreateUserThread, EAX
  128.    sWin32    ESI, EDI, sNTTH
  129.    MOV       NtTerminateThread, EAX
  130.    sWin32    ESI, EDI, sNQIT
  131.    MOV       NtQueryInformationThread, EAX
  132. ;--------------------
  133.    ;enable debug privilege for this process if possible
  134.    iWin32    GetCurrentProcess
  135.    PUSH      ECX             ;place for hToken
  136.    MOV       CurrentProcess, EAX
  137.    iWin32    OpenProcessToken, EAX, TOKEN_QUERY OR TOKEN_ADJUST_PRIVILEGES, ESP
  138.    TEST      EAX, EAX
  139.    POP       EDI             ;hToken
  140.    JE        CantOpenToken   ;failed
  141.    ;LookupPrivValue can be excluded if I use hard ntddk value for debug priv.: 14H in LUID
  142.    iWin32i   LookupPrivilegeValue, NULL, szSE_DEBUG_NAME, OFFSET dbLUID
  143.    TEST      EAX, EAX
  144.    JE        CloseToken      ;can't find local (numeric) representation of the privilege
  145.    ;enable the privilege in my token
  146.    iWin32    AdjustTokenPrivileges, EDI, FALSE, OFFSET NewState, 0, NULL, NULL
  147.   CloseToken:
  148.    iWin32    CloseHandle, EDI   ;close hToken
  149.   CantOpenToken:
  150. ;--------------------
  151.    ;initialze APIs for remote codes (ApiWorks and ModWorks)
  152.    iMOV      EAX, VirtualQuery
  153.    MOV       _VirtualQuery, EAX
  154.    iMOV      EAX, GetModuleFileNameA
  155.    MOV       _GetModuleFileNameA, EAX
  156.    iMOV      EAX, LoadLibraryA
  157.    MOV       _LoadLibraryA, EAX
  158.    MOV       _GetProcAddress, ESI  ;in ApiWorks
  159.    MOV       _GetProcAddr, ESI     ;in ModWorks
  160.    iMOV      EAX, GetModuleHandleA
  161.    MOV       _GetModuleHandleA, EAX
  162.    MOV       _DllOperation, EAX
  163.    iMOV      EAX, VirtualProtect
  164.    MOV       _VirtualProtect,  EAX
  165.    iMOV      EAX, lstrcmpiA
  166.    MOV       _lstrcmpiA, EAX
  167.    iMOV      EAX, KERNEL32_ORD_0001
  168.    MOV       _KERNEL32_ORD_0001, EAX
  169.    iMOV      EAX, FreeLibrary
  170.    MOV       _FreeLibrary, EAX
  171. ;--------------------
  172.    iWin32    GetCurrentProcessId
  173.    MOV       CurPID, EAX       ;my PID
  174.    XOR       EAX, FS:TEB.pPEB  ;9x Obsfucator = MyPID ^ TEB.pProcess
  175.    MOV       Obsfucator, EAX
  176. ;--------------------
  177.    iWin32    GetVersion
  178.    MOV       W32Version, EAX
  179.    TEST      EAX, EAX
  180.    JNS       DoNT
  181.  
  182.   DoW9x:                 ;9x stuff
  183.    iMOV      EAX, OpenProcess
  184.    ADD       EAX, 24H
  185.    CMP       DWORD PTR [EAX], 000000B9H   ;is OpenThread routine present?
  186.    JNE       NoOpenThread9x
  187.    MOV       W9xOpenThread, EAX
  188.    JMP       Initialized
  189.  
  190.   DoNT:                  ;NT stuff
  191.    MOV       BYTE PTR W9xJMP0, 75H ;allow NO_UNBIND in ApiWorks: JMP -> JNE
  192.    MOV       RemoteAlloc,   RemoteAllocNT
  193.    MOV       RemoteFree,    RemoteFreeNT
  194.    MOV       OpenAllThreads,OpenAllThreadsNT
  195.    CMP       AL, 5       ;Win2K+ -> don't patch thread info start
  196.    JAE       Initialized
  197.    MOV       ThreadInfoStart,  NT4_SYSTEM_PROCESS_INFORMATION.ThreadInformation + SYSTEM_THREAD_INFORMATION.ClientId.UniqueThread
  198. ;--------------------
  199.   NoOpenThread9x:
  200.   Initialized:
  201.    POPc      ESI, EDI    ;restore used registers
  202. ;--------------------
  203.   DllMainRet:
  204.    XOR       EAX, EAX
  205.    INC       EAX         ;return TRUE
  206.    RET       12
  207.   DllMain          ENDP
  208. ;=================================================================================
  209. ;Exception handler sets EIP to DrWtson, ESP to xFrameESP and EAX to error code
  210.   xHandler         PROC
  211.    MOV       EDX, [ESP+12] ;context
  212.    ADD       EDX, CONTEXT.regEax
  213.    MOV       EAX, [ESP+8]  ;xESP
  214.    MOV       [EDX+CONTEXT.regEip-CONTEXT.regEax], DrWatson
  215.    MOV       [EDX+CONTEXT.regEsp-CONTEXT.regEax], EAX
  216.    oMOV      [EDX+CONTEXT.regEax-CONTEXT.regEax], ErrorException
  217.    XOR       EAX, EAX    ;ExceptionContinueExecution
  218.    RETN
  219.   xHandler         ENDP
  220. ;=================================================================================
  221. ;Checks if process represented by procID is initialzed. In 9x it is always
  222. ;true. In NT it is not true if the process was created suspended and wasn't
  223. ;resumed yet. Remote thread in such a process in Win2K = crash the process.
  224. ;Returns FALSE if process is not initialize